using System;
using System.Reflection;
using UnityEngine;

namespace Life.UI.MVC.View
{
    /// <summary>
    /// 关于View的定义：一个UI既是一个View
    /// ViewBase是所有View的基类
    /// 用于承载和连接UI的所有元素、实现UI的动画效果……
    /// </summary>
    public abstract class ViewBase : MonoBehaviour
    {
        public void Awake()
        {
#if UNITY_EDITOR && !RELEASE
            //在编辑器且非Release模式下，检查所有引用是否绑定对象
            CheckReference();
#endif
            OnAwake();
        }
        
#if UNITY_EDITOR
        /// <summary>
        /// 检查所有引用是否绑定对象
        /// </summary>
        private void CheckReference()
        {
            Type type = GetType();
            //获取实例所有的字段
            var members = type.GetMembers(BindingFlags.Instance);
            //遍历所有字段检查是否有未绑定对象
            foreach (var t in members)
            {
                if(t.MemberType == MemberTypes.Field)
                {
                    FieldInfo field = (FieldInfo)t;
                    if (field.GetValue(this) == null)
                    {
                        Debug.LogError($"Dev: {type.Name}的{field.Name}未绑定对象");
                    }
                }
            }
        }
#endif
        /// <summary>
        /// 当父类的Awake执行完成时调用，用于子类添加自己的Awake逻辑
        /// </summary>
        protected virtual void OnAwake()
        {
            
        }
        /// <summary>
        /// 用于View中的所有元素恢复至初始状态
        /// </summary>
        public abstract void OnClear();
        public void SetActive(bool active)
        {
            if (active)
            {
                if(!gameObject.activeSelf)
                    gameObject.SetActive(true);
            }
            else
            {
                if(gameObject.activeSelf)
                    gameObject.SetActive(false);
            }
        }
    }
}

